package QianFeng07.IODemo.ByteAndDataArrayStream;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

/**
 * 字节数组流
 * 基于内存操作，内部维护着一个字节数组，我们可以利用流的读取机制来处理字符串，无需关闭
 *
 * ByteArrayInputStream
 * 包含一个内部缓冲区，该缓冲区包含从流中读取的字节。内部计数器跟踪read方法要提供的下一个字节。
 * 关闭ByteArrayInputStream无效。此类中的方法在关闭此流后仍可被调用，而不会产生任何lOException。
 *
 * ByteArrayOutputStream
 * 此类实现了一个输出流，其中的数据被写入一个byte数组。缓冲区会随着数据的不断写入而自动增长。
 * 可使用toByteArray()和toString()获取数据。关闭ByteArrayOutputStream无效。
 * 此类中的方法在关闭此流后仍可被调用，而不会产生任何lOException。
 **/
public class ByteArrayStreamDemo {
    public static void main(String[] args) {
        byteArrayStream();
    }

    private static void byteArrayStream() {
        String s = "123456789ashil(*&^%$#@ASHIL";
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(s.getBytes());
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        int current = -1;//每次读取的字节
        while ((current = byteArrayInputStream.read()) != -1) {
            //65-90 A-Z    97-122 a-z
            if ((current >= 65 && current <= 90) || (current >= 97 && current <= 122)) {
                byteArrayOutputStream.write(current);
            }
        }
        //此时无需关闭，原因是字节数组流是基于内存的操作流
        System.out.println(byteArrayOutputStream.toString());
    }
}
